package com.gaoqi.mq.TestRabbitMQ;

import com.gaoqi.mq.utils.RabbitMQ;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import lombok.extern.slf4j.Slf4j;
import org.testng.annotations.Test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 该类用于模拟rabbitMQ 生产消息
 * 生产者和消费者 参数需要保持一致 否则报IO exception
 */
@Slf4j
public class Provider {

    //生产消息 rabbitMQ 简单模式
    @Test
    public void TestSendMessage() throws IOException, TimeoutException {

        //通过自定义工具类回去mq 连接对象
        Connection rabbitConnection = RabbitMQ.getRabbitConnection();
        log.info("获取RabbitMQ连接对象:{}", rabbitConnection);

        //获取连接通道
        Channel getChannel = rabbitConnection.createChannel();
        log.info("获取连接管道:{}", getChannel);

        //通道绑定 对应消息队列
        //参数1: queue  队列名称 若无自动创建
        //参数2: durable 是否持久化（false rabbit 重启后不会保留该队列  false rabbit 重启后会保留该队列）
        //参数3: exclusive 是否独占队列 (true 该队列只能被当前通道所绑定 用完即释放 即使是做了持久化)
        //参数4: autoDelete 消息被消费后  队列是否自动删除
        //参数5: 附加参数
        getChannel.queueDeclare("test", true, false, true, null);


        //发布消息(basicPublish 才是真正决定将消息发送至那个队列)
        //参数1: exchange 交换机名称
        //参数2: routingKey 队列名称
        //参数3: props 传递消息额外设置(该属性可以完成消息的持久化 MessageProperties.PERSISTENT_TEXT_PLAIN)
        //参数4:消息具体内容
        getChannel.basicPublish("", "test", MessageProperties.PERSISTENT_TEXT_PLAIN, "hi test".getBytes());


        //关闭通道 和 mq连接
        RabbitMQ.closeChannelAndConnection(getChannel, rabbitConnection);
    }


    //生产者生产消息 工作模式
    @Test
    public void TestRabbitMQWork() throws IOException {
        //通过自定义Utils获取mq连接对象
        Connection rabbitConnection = RabbitMQ.getRabbitConnection();
        log.info("获取rabbitmq 连接对象:{}", rabbitConnection);

        //获取通道对象
        Channel providerChannel = rabbitConnection.createChannel();
        log.info("获取通道对象:{}", providerChannel);

        //通道绑定 声明参数
        providerChannel.queueDeclare("work", true, false, false, null);

        //循环依次生产多个消息
        for (int i = 1; i <= 100; i++) {

            providerChannel.basicPublish("", "work", null, ("this is message" + i).getBytes());
        }

        //关闭通道及 连接
        RabbitMQ.closeChannelAndConnection(providerChannel, rabbitConnection);
    }

}
